package org.al.poc.persistence.dao;

import java.util.Properties;

/**
 * Classe mère de l'implémentation des fabriques pour les Dao.
 * @author Raphael, Jérome
 */
public abstract class DaoFactory {
	
	/**
	 * Les types de persistance.
	 */
	public enum TypeFabrique { JPAOracle };
	
	private static TypeFabrique typeFabrique;
	
	public abstract Connexion getConnexion() throws DaoException;
	
	public abstract DaoOrder getDaoOrder() throws DaoException;
	
	public abstract void close() throws DaoException;
	
	public abstract TypeFabrique getTypePersistence ();
	
	
	/**
	 * Définit le type de persistance à utiliser.
	 * @param type le type de persistance.
	 */
	public static void setTypeDao (TypeFabrique type) {
		typeFabrique = type;
	}
	
	/**
	 * Créer et renvoie une fabrique de Dao associée au type de persistance.
	 * @param prop les propriétés de connexion à la BD.
	 * @return une fabrique de Dao associée au type de persistance.
	 * @throws DaoException si un problème de persistance est rencontré.
	 * @throws IllegalArgumentException si la fabrique est incorrecte.
	 */
	public static DaoFactory getDaoFactory (Properties prop) throws DaoException, IllegalArgumentException {
		switch (typeFabrique) {
			case JPAOracle : 
				DaoFactoryJpa.setTypeSGBD(DaoFactoryJpa.TypeSGBD.Oracle);
				return DaoFactoryJpa.getDaoFactoryJpa(prop);
			default:
				throw new IllegalArgumentException("Type de fabrique inconnu !");
		}
	}

}
